package com.baizhi.dcx.service;


import com.baizhi.dcx.dao.AdminDao;
import com.baizhi.dcx.entity.Admin;
import com.baizhi.dcx.util.ImageCodeUtil;
import com.baizhi.dcx.util.Md5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;


@Service
@Transactional
public class AdminServiceImpl implements AdminService {
   @Autowired
   private AdminDao adminDao;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void register(Admin admin) {
        String password = admin.getPassword();
        //调用工具类  获取随机盐
        String salt = Md5Utils.getSalt(6);
        //对原始密码加随机盐
        String saltPwd= salt + password + salt;
        //调用工具类  对加随机盐后的密码  进行md5加密
        String md5Code = Md5Utils.getMd5Code(saltPwd);
        //对传递过来的管理员数据 进行数据加工
        admin.setPassword(md5Code);
        admin.setSalt(salt);
        adminDao.insert(admin);
    }

    /*@Override
    public Admin queryBuName(String username) {
        return adminDao.selectByUsername(username);
    }*/

    //生成验证吗
    public Map<String,String> getlmageCodes() throws IOException {
        Map<String, String> map = new HashMap<>();
        //调用工具类  获取随机验证码字符
        String code = ImageCodeUtil.getSecurityCode();
        //调用工具类   根据随机吗生成图片 base64形式
        String imgBase64 = ImageCodeUtil.careateImgBase64(code);
        //把base64图片信息存入map
        map.put("imgCode",imgBase64);

        //获取UUID
        String uuid = UUID.randomUUID().toString();
        //把UUID存入验证码
        map.put("token",uuid);

        //往redis中存验证码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations valuesOps = redisTemplate.opsForValue();
        valuesOps.set("CODE_"+uuid,code,1,TimeUnit.MINUTES);

        return map;
    }
    //登录
    @Override
    public Map<String,String> queryByUsername(@RequestBody Admin admin, String token) {
        Map<String,String> map =new HashMap<String,String>();
        //从redis中获取服务器上验证码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations valuesOps = redisTemplate.opsForValue();
        Object obj = valuesOps.get("CODE_"+token);
        //检查验证码
        if (obj == null){
            map.put("message","验证码过期");
            map.put("state","error");
            return map;
        }

        if (!admin.getEnCode().equals(obj)){
            map.put("message","验证码错误");
            map.put("state","error");
            return map;
        }
        Admin admin1 = adminDao.selectByUsername(admin.getUsername());
        if (admin1==null){
            map.put("message","用户不存在");
            map.put("state","error");
            return map;
        }else {
            if (admin1.getStatus() =="0"){
                map.put("message","用户已冻结");
                map.put("state","error");
                return map;
            }

            String passwd =admin1.getSalt() + admin.getPassword() + admin1.getSalt();
            String md5Code = Md5Utils.getMd5Code(passwd);
            if (md5Code.equals(admin1.getPassword())){
                map.put("state","success");
                map.put("message",token);
                valuesOps.set("TOKEN_"+token,admin1);
            }else {
                map.put("message","密码不正确");
                map.put("state","error");
                return map;
            }
        }


        return map;
    }

    @Override
    public Admin getUserInfo(String token) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations valueOp = redisTemplate.opsForValue();
        return (Admin)valueOp.get("TOKEN_"+token) ;
    }

    @Override
    public void logout(String token) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.delete("TOKEN_"+token);
    }
}
